﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace AvaProvi
{
    [Serializable]
    public class clsTipoDeConstruccion_CRN:clsEstado,IControlEstados
    {
        #region Propiedades
        public int IDTipoDeConstrucccion { get; set; }
        public clsConstruccion_CRN  Construccion { get; set; }
        public string Tipo { get; set; }
        public string Descripcion { get; set; }
        public decimal Superficie { get; set; }
        public decimal VP { get; set; }
        public decimal VUR
        {
            get
            {
                return VP - Edad;
            }
        }
        public decimal Edad { get; set; }
        public double VRNm2 { get; set; }
        public double FactorObsolencia { get; set; }
        public double FactorComercializacion { get; set; }
        public double FactorEdad
        {
            get
            {
                return ((Convert.ToDouble(this.VP) * 0.1) + (Convert.ToDouble(this.VUR) * 0.9)) /Convert.ToDouble(this.VP);
            }
        }
        public double FEf
        {
            get
            {
                return this.FactorComercializacion * this.FactorObsolencia * this.FactorEdad;
            }
        }
        public double Demerito
        {
            get
            {
                return 1-FEf;
            }
        }
        public double ValorAsegurable
        {
            get
            {
                return Convert.ToDouble(this.Superficie) * this.VRNm2 * 0.85;
            }
        }
        public double Depreciacion
        {
            get
            {
                return this.VRNm2 * this.Demerito;
            }
        }
        public double VNRm2
        {
            get
            {
                return this.VRNm2 - this.Depreciacion;
            }
        }
        public decimal ValorParcial
        {
            get
            {
                return Convert.ToDecimal(this.VNRm2) * this.Superficie;
            }
        }
        #endregion 

        #region Constructor
        public clsTipoDeConstruccion_CRN(clsConstruccion_CRN objConstruccion):base()
        {
            this.Construccion = objConstruccion;
            this.Descripcion = string.Empty;
            this.Superficie = 0;
            this.Tipo = string.Empty;
            this.VP = 0;
            this.Edad = 0;
        }
        #endregion

        #region Métodos

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return NuevoTipoDeCosntruccion();
                else
                {
                    if (this.EsModificado)
                        return ModificaTipoDeConstruccion();
                    else
                        return EliminaTipoDeConstruccion();
                }
            }
            return false;
        }

        private bool EliminaTipoDeConstruccion()
        {
            clsTipoDeConstruccion_CD objTipoDeConstruccion_CD = new clsTipoDeConstruccion_CD();
            return objTipoDeConstruccion_CD.EliminaTipoDeConstruccion(this);
        }

        private bool ModificaTipoDeConstruccion()
        {
            clsTipoDeConstruccion_CD objTipoDeConstruccion_CD = new clsTipoDeConstruccion_CD();
            return objTipoDeConstruccion_CD.ModificaTipoDeConstruccion(this);
        }

        private bool NuevoTipoDeCosntruccion()
        {
            clsTipoDeConstruccion_CD objTipoDeConstruccion_CD = new clsTipoDeConstruccion_CD();
            return objTipoDeConstruccion_CD.CreaTipoDeConstruccion(this);
        }

        public bool DatosValidos()
        {
            if ((this.Tipo.Length == 0) && (this.Descripcion.Length == 0) && (this.Superficie == 0) && (this.VP ==0) && (this.Edad == 0))
            {
                this.EsEliminado = true;
                return true;
            }
            return true;
        }

        public static BindingList<clsTipoDeConstruccion_CRN> RecuperaTiposDeCosntruccion(clsConstruccion_CRN objConstruccion)
        {
             clsTipoDeConstruccion_CD objTipoDeConstruccion_CD = new clsTipoDeConstruccion_CD();
            BindingList<clsTipoDeConstruccion_CRN> blTiposDeConstruccion = new BindingList<clsTipoDeConstruccion_CRN>();
            BindingList<dsConstruccion.TiposDeConstruccionRow> blTiposRecuperados = objTipoDeConstruccion_CD.RecuperaTiposDeConstrucion(objConstruccion.Terreno.Inmueble.Avaluo.IdAvaluo);
            foreach (dsConstruccion.TiposDeConstruccionRow filaTipo in blTiposRecuperados)
            {
                clsTipoDeConstruccion_CRN objTipoDeCosntruccion = new clsTipoDeConstruccion_CRN(objConstruccion);
                objTipoDeCosntruccion.Descripcion = filaTipo.Descripcion;
                objTipoDeCosntruccion.Edad = filaTipo.Edad;
                objTipoDeCosntruccion.EsModificado = true;
                objTipoDeCosntruccion.IDTipoDeConstrucccion = filaTipo.ID;
                objTipoDeCosntruccion.Superficie = filaTipo.Superficie;
                objTipoDeCosntruccion.Tipo = filaTipo.Tipo;
                objTipoDeCosntruccion.VP = filaTipo.VP;
                objTipoDeCosntruccion.VRNm2 = filaTipo.VRNm2;
                objTipoDeCosntruccion.FactorComercializacion = filaTipo.FactorComercializacion;
                objTipoDeCosntruccion.FactorObsolencia = filaTipo.FactorOtro;
                blTiposDeConstruccion.Add(objTipoDeCosntruccion);
            }
            return blTiposDeConstruccion;
        }

        #endregion
    }
}
    